﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace WindowsCompatibility
{
    public class CurrentHwProfileHelper
    {
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool GetCurrentHwProfile(IntPtr fProfile);
        /// <summary>
        /// 检索有关本地计算机当前硬件配置文件的信息
        /// </summary>
        /// <returns></returns>
        public HWProfile GetCurrentHwProfile()
        {
            IntPtr lHWInfoPtr = Marshal.AllocHGlobal(123);
            HWProfile lProfile = new HWProfile();
            Marshal.StructureToPtr(lProfile, lHWInfoPtr, false);

            if (GetCurrentHwProfile(lHWInfoPtr))
            {
                Marshal.PtrToStructure(lHWInfoPtr, lProfile);
            }

            Marshal.FreeHGlobal(lHWInfoPtr);
            return lProfile;
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public class HWProfile
    {
        /// <summary>
        /// 报告的计算机对接状态
        /// </summary>
        public DwDockInfo dwDockInfo;

        /***
         * MarshalAs 指示如何在托管代码与非托管代码之间封送数据
         * https://docs.microsoft.com/zh-cn/dotnet/api/system.runtime.interopservices.marshalasattribute?view=net-5.0
         * 
         * */
        /// <summary>
        /// 当前硬件配置文件的全球唯一标识符 （GUID） 字符串
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 39)]
        public string szHwProfileGuid;
        /// <summary>
        /// 当前硬件配置文件的显示名称
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
        public string szHwProfileName;
    }

    [Flags]
    public enum DwDockInfo : int
    {
        /// <summary>
        /// 电脑没有插座。此标志始终设置为无法撤下的桌面系统
        /// </summary>
        DOCKINFO_UNDOCKED = 1,
        /// <summary>
        /// 计算机已停靠
        /// </summary>
        DOCKINFO_DOCKED = 2,
        /// <summary>
        /// 如果设置此标志，GetCurrentHwProfile将从用户在系统控制面板应用程序的硬件配置文件页面中提供的信息中检索当前对接状态。
        /// </summary>
        DOCKINFO_USER_SUPPLIED = 4,
    }
}
